package ifrn.agendaweb.modelo;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.springframework.format.annotation.DateTimeFormat;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
public class Compromisso implements Serializable {
	
	
	private static final long serialVersionUID = 7487519917065788462L;

	private int id;
	private String titulo;
	private String descricao;
	@DateTimeFormat(pattern="dd/MM/yyyy HH:mm")
	private Date dataInicial;
	private Date dataFinal;
	
	@JsonIgnore
	Set<Contato> contatos;
	
	private String dataInicialFormulario;
	private String dataFinalFormulario;
	

	private String horaInicialFormulario;
	private String horaFinalFormulario;
	
	private Usuario usuario;

	
	private String[] addContatos;
	private String[] remContatos;
	
	
	public Compromisso () {
		
	}

	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}


	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}


	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	
	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataInicial() {
		return dataInicial;
	}
	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}


	@Temporal(TemporalType.TIMESTAMP)
	public Date getDataFinal() {
		return dataFinal;
	}
	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}
	
	
	@ManyToOne
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	
	@ManyToMany
	public Set<Contato> getContatos() {
		return this.contatos;
	}
	
	public void setContatos(Set<Contato> contatos) {
		this.contatos = contatos;
	}
	
	
	@Transient
	public String getDataInicialFormulario() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		if (dataInicial != null) {
			try {
				return sdf.format(dataInicial);
			} catch (Exception e) {
			}
			return "";
		} else if (dataInicialFormulario == null) {
			sdf = new SimpleDateFormat("dd/MM/yyyy");
			try {
				return sdf.format(new Date());
			} catch (Exception e) {
			}
			return "";
		}
		return dataInicialFormulario +" "+ horaInicialFormulario;
	}
	public void setDataInicialFormulario(String dataInicialFormulario) {
		this.dataInicialFormulario = dataInicialFormulario;
	}

	
	@Transient
	public String getDataFinalFormulario() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		if (dataFinal != null) {
			try {
				return sdf.format(dataFinal);
			} catch (Exception e) {
			}
			return "";
		} else if (dataFinalFormulario == null) {
			sdf = new SimpleDateFormat("dd/MM/yyyy");
			try {
				return sdf.format(new Date());
			} catch (Exception e) {
			}
			return "";
		}
		return dataFinalFormulario +" "+ horaFinalFormulario;
	}
	public void setDataFinalFormulario(String dataFinalFormulario) {
		this.dataFinalFormulario = dataFinalFormulario;
	}
	
	
	@Transient
	public String getHoraInicialFormulario() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
		if (horaInicialFormulario == null) {
			try {
				return sdf.format(new Date());
			} catch (Exception e) {
			}
			return "";
		}
		return horaInicialFormulario;
	}
	public void setHoraInicialFormulario(String horaInicialFormulario) {
		this.horaInicialFormulario = horaInicialFormulario;
	}

	
	@Transient
	public String getHoraFinalFormulario() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
		if (horaFinalFormulario == null) {
			try {
				return sdf.format(new Date());
			} catch (Exception e) {
			}
			return "";
		}
		return horaFinalFormulario;
	}
	public void setHoraFinalFormulario(String horaFinalFormulario) {
		this.horaFinalFormulario = horaFinalFormulario;
	}
	
	
	@Transient
	public String[] getAddContatos() {
		return this.addContatos;
	}
	
	public void setAddContatos(String[] addContatos) {
		this.addContatos = addContatos;
	}
	
	
	@Transient
	public String[] getRemContatos() {
		return this.remContatos;
	}
	
	public void setRemContatos(String[] remContatos) {
		this.remContatos = remContatos;
	}
	
	@Transient
	public Set<Contato> addContatosToContatos() {
		Set<Contato> contatos = new HashSet<>();
		
		for (int i = 0; i < this.addContatos.length; i++) {
			if (!this.addContatos.equals("")) {
				String [] contato = this.addContatos[i].split("#");
				if (!contato[0].equals("")) {
					Contato c = new Contato();
					c.setId(Integer.parseInt(contato[0]));
					contatos.add(c);
				}
			}
		}
		
		return contatos;
	}
	
	@Transient
	public String[] contatosToAddContatos() {
		ArrayList<String> addContatos = new ArrayList<>();
		
		for (Contato contato : contatos) {
			addContatos.add(contato.getId() +"#"+ contato.getEmail() +" ("+ contato.getNome() +")");			
		}
		
		return addContatos.toArray(new String[addContatos.size()]);
	}

}
